package com.topscomm.file.watermark;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.imageio.ImageIO;
import javax.swing.JLabel;

import lombok.extern.slf4j.Slf4j;

/**
 * 图片添加水印
 * 
 * @description:
 * @author: donghang
 * @date: 2021年4月10日上午11:21:47
 * @modify:
 */
@Slf4j
public class ImageRemarkUtil {
	// 定义图片水印字体类型
	public static final String FONT_NAME = "微软雅黑";

	// 定义图片水印字体加粗、变细、倾斜等样式
	public static final int FONT_STYLE = Font.BOLD;

	// 设置字体大小
	public static final int FONT_SIZE = 25;

	// 设置文字透明程度
	public static float ALPHA = 0.3F;

	/**
	 * 添加多文字水印
	 * 
	 * @description:
	 * @param inputStream
	 * @param word
	 * @param color
	 * @param degree
	 * @return
	 * @author: donghang
	 * @date: 2021年4月10日上午11:42:17
	 * @modify:
	 */
	public static void markImageByMoreText(InputStream inputStream, OutputStream outputStream, String word, Color color,
			Integer degree) {
		// 获取源图像的宽度、高度
		Image image = null;
		try {
			image = ImageIO.read(inputStream);
			markImageByMoreText(image, outputStream, word, color, degree);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (image != null) {
				image.getGraphics().dispose();
			}
		}

	}

	/**
	 * 
	 * @description:
	 * @param image
	 * @param word
	 * @param color
	 * @param degree
	 * @return
	 * @author: donghang
	 * @date: 2021年4月10日上午11:52:59
	 * @modify:
	 */
	private static void markImageByMoreText(Image image, OutputStream outputStream, String word, Color color,
			Integer degree) {
		Graphics2D graphics2D = null;
		BufferedImage bufferedImage = null;
		try {
			int width = image.getWidth(null);
			int height = image.getHeight(null);
			bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
			// 创建绘图工具对象
			graphics2D = bufferedImage.createGraphics();
			// 设置水印文字（设置水印字体样式、粗细、大小）
			Font font = new Font(FONT_NAME, FONT_STYLE, (int) ((float) width) / 600 * 10);
			graphics2D.setFont(font);
			// 其中的0代表和原图位置一样
			graphics2D.drawImage(image, 0, 0, width, height, null);

			// 设置水印颜色
			graphics2D.setColor(color);
			// 设置水印透明度
			graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, ALPHA));
			// 设置水印旋转
			if (null != degree) {
				graphics2D.rotate(Math.toRadians(degree));
			}

			JLabel label = new JLabel(word);
			FontMetrics metrics = label.getFontMetrics(font);
			// 文字水印的宽
			int wordWidth = metrics.stringWidth(label.getText()) * 2;
			// 图片的高 除以 文字水印的宽 ——> 打印的行数(以文字水印的宽为间隔)
			int rowsNumber = height / wordWidth;
			// 图片的宽 除以 文字水印的宽 ——> 每行打印的列数(以文字水印的宽为间隔)
			int columnsNumber = width / wordWidth;
			// 防止图片太小而文字水印太长，所以至少打印一次
			if (rowsNumber < 1) {
				rowsNumber = 1;
			}
			if (columnsNumber < 1) {
				columnsNumber = 1;
			}
			for (int j = 0; j < rowsNumber; j++) {
				for (int i = 0; i < columnsNumber; i++) {
					graphics2D.drawString(word, i * wordWidth + j * wordWidth, -i * wordWidth + j * wordWidth);// 画出水印,并设置水印位置
				}
			}

			ImageIO.write(bufferedImage, "jpg", outputStream);
		} catch (IOException e) {
			log.error("添加水印失败");
		} finally {
			if (graphics2D != null) {
				graphics2D.dispose();
			}
			if (bufferedImage != null) {
				bufferedImage.getGraphics().dispose();
			}
		}
	}

}
